package com.fingard.dsp.bank.directbank.shie01;

import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.fingard.dsp.bank.directConfig.ActSetItem;
import com.fingard.dsp.bank.directbank.DirectBase;
import com.fingard.io.FileHelper;
import com.shie.openapi.client.ShieClient;
import com.shie.openapi.dto.RequestDto;
import com.shie.openapi.dto.ResponseDto;
import com.shie.openapi.enmu.ShieEvnEnmu;

public class SHIE01Base extends DirectBase {
	/**
	 * 获取字符编码
	 * 
	 * @return 当前字符编码
	 */
	protected String getCharset() {
		return getBankConfig().getCharset("utf-8");
	}
	
	/**
	 * 获取账户业务类型  
	 * 
	 * @return 1001：普通账户；     1002：资管账户
	 * @throws Exception
	 */
	public String getAccountType() throws Exception {
		return getBankConfig().getMapValueByKey("accountType", "1");
	}
	
	/**
	 * 获取保险产品代码
	 * 
	 * @return  tpcx : 太平财险
	 * @throws Exception
	 */
	public String getProductCode() throws Exception {
		return getBankConfig().getMapValueByKey("productCode", "1");
	}
	
	/**
	 * 发送保交所并获取返回
	 * 
	 * @param actItem     商户配置信息
	 * @param bizContent  业务JSON
	 * @param serviceCode 当前服务
	 * @return            响应JOSN
	 * @throws Exception  服务器请求异常
	 */
	public ResponseDto sendToSHIE(ActSetItem actItem, String serviceCode, Map<String, Object> bizContent) throws Exception {
		// 商户证书
		String privateKey = FileHelper.readFileText(actItem.ownKeyStorePath, getCharset());
		// 当前环境 2-测试环境   3- 开发环境
		String evn = getBankConfig().getMapValueByKey("evn", "1");
		// 商户token
		String token = getBankConfig().getValueAsString("token");
		
		// 请求JSON对象
		RequestDto requestDto = new RequestDto(serviceCode, actItem.merchantId, token);
		
		WriteBankLogLn2("加密前请求JSON：" + JSON.toJSONString(bizContent));
		
		// ShieClient参数为connectTimeout，readTimeout的毫秒数
		ShieClient shieClient = new ShieClient(5000, 5000);
		
		// 发送保交所并获取返回
		ResponseDto responseDto = shieClient.send(requestDto, bizContent, evn, privateKey);
		
		// 请求JSON
		WriteBankLogStep2(JSON.toJSONString(requestDto));

		// 响应JSON
		WriteBankLogStep3(JSON.toJSONString(responseDto));
		
		return responseDto;
	}
}
